/*
Listas.java
Autor: Paola Garcia, carnet 10205
Fecha: 22 septiembre 2011
Descripcion: clase que extiende de la clase Abstracta, lo cual implementa 
las colas con listas circulares
*/

import java.util.List;
import java.util.LinkedList;

public class Listas<T> extends Abstracta<T>{
	
	//declaracion de colas
	private List<T> cola1 = new LinkedList<T>();
	private List<T> cola2 = new LinkedList<T>();
	private List<T> cola3 = new LinkedList<T>();
	private List<T> cola4 = new LinkedList<T>();

	
	//declaracion de variables
	protected Listas<T> tail;
	protected T data;
	protected Listas<T> nextElement;
	protected int numc1 = 0, numc2=0, numc3=0, numc4=0;
	protected T estado;
	protected boolean c1 = true, c2 = false, c3 = false, c4 = false;
	
	//constructor
	public Listas(){
		tail = null;
	}
	
	//constructor predeterminado
	public Listas<T> next(){
		return nextElement;
	}
	
	//generar lista de valores
	public Listas(T v){
		this();
	}
	
	//agregar el siguiente de la lista
	public void setNext(Listas<T> next){
		nextElement = next;
	}
	
	//el valor de la posicion de la cola
	public T value(){
		return data;
	}
	
	//agregar al final al usuario
	public void addLast(T value){
		//comparar cual es la cola menos llena
		if(numc1 <= numc2 && numc1<= numc3 && numc1<=numc4 && numc1<=10){
			numc1 ++;
			cola1.add(value);
			//determinar en que cola debe sacar
			c1 = true;
			c2 = false;
			c3 = false;
			c4 = false;
		}
		else{
			//comparar cual es la cola menos llena
			if(numc2 <= numc1 && numc2<= numc3 && numc2<=numc4 && numc2<=10){
				numc2 ++;
				cola2.add(value);
				//determinar en que cola debe sacar
				c2 = true;
				c1 = false;
				c3 = false;
				c4 = false;
			}
			else{
				//comparar cual es la cola menos llena
				if(numc3 <= numc1 && numc3<= numc2 && numc3<=numc4 && numc3<=10){
					numc3 ++;
					cola3.add(value);
					//determinar en que cola debe sacar
					c3 = true;
					c1 = false;
					c2 = false;
					c4 = false;
				}
				else{
					//comparar cual es la cola menos llena
					if(numc4 <= numc1 && numc4<= numc2 && numc4<=numc3 && numc4<=10){
						numc4 ++;
						cola4.add(value);
						//determinar en que cola debe sacar
						c4 = true;
						c1 = false;
						c2 = false;
						c3 = false;
					}
					else
						System.out.println("Banco lleno");
				}
			}
		}
	}
	
	//sacar a un usuario de la lista
	public T remove(){
		//si es en la cola1
		if(c1){
			estado = cola1.get(numc1-1);
			System.out.println("El cliente No. " + (numc1+1) + " ha salido");
		}
		else{
			//si es en la cola2
			if(c2){
				estado = cola2.get(numc2-1);
				System.out.println("El cliente No. " + (numc2+1) + " ha salido");
			}
			else{
				//si es en la cola 3
				if(c3){
					estado = cola3.get(numc3-1);
					System.out.println("El cliente No. " + (numc3+1) + " ha salido");
				}
				else{
					//si es en la cola4
					if(c4){
						estado = cola4.get(numc4-1);
						System.out.println("El cliente No. " + (numc4+1) + " ha salido");
					}
				}
			}
		}
	return estado;
	}

	//muestra el estado de las colas
	public String toString(){
		String datos = "";
		datos += "El numero de clientes en la cola1 es de: " + numc1 + ".";
		datos += "\n";
		datos += "El numero de clientes en la cola2 es de: " + numc2 + ".";
		datos += "\n";
		datos += "El numero de clientes en la cola3 es de: " + numc3 + ".";
		datos += "\n";
		datos += "El numero de clientes en la cola4 es de: " + numc4 + ".";
		return datos;
	}
}
